#include "game.h"

void print_start_ui()//打印初始化界面
{
 
     printf("\33[2J");
     int i;

    //画上下两恒
     for(i = 0;i < 47;i++){
         printf("\33[%d;%dH\33[43m \33[0m",5,i+10);//(10,5 )
         printf("\33[%d;%dH\33[43m \33[0m",30,i+10);//(,30 )
     }

    //画三束
     for(i = 0;i < 26;i++){
         printf("\33[%d;%dH\33[43m  \33[0m",i+5,10);//(10,5 )
         printf("\33[%d;%dH\33[43m  \33[0m",i+5,40);//(40,5)
         printf("\33[%d;%dH\33[43m  \33[0m",i+5,56);//(56, )
     }

    //画短横
     for(i=0;i < 17;i++){
    	 printf("\33[%d;%dH\33[43m \33[0m",12,40+i);
     }
    //画分数和等级
     printf("\33[%d;%dH分数:%d\33[0m",score_y,score_x,score);
     printf("\33[%d;%dH等级:%d\33[0m",level_y,level_x,level);
     fflush(NULL);
}
struct termios tm_old;
int getch(){//设置终端不回显，并拿到用户输入
    struct termios tm;
    //用户输入，带回显
   tcgetattr(0,&tm_old);
   
   //关闭回显
   cfmakeraw(&tm);
   
   //把用户输入写入立即生效
   tcsetattr(0,0,&tm);
   
   //获取字符
   int ch = getchar();
   
   //老的终端重置回去
   recover_attr();
   return ch;
}
void recover_attr(){
    tcsetattr(0,0,&tm_old);
}
void key_control(){//键盘控制
    int ch;
       while(1){
        ch = getch(); 
        if(ch == 'q' || ch == 'Q')
        {
            break;
        }
        else if(ch == '\r'){
            move_button(dynamic_type,dynamic_changeType,color);
        }
        else if(ch == '\33')
        {
            ch = getch(); 
            if(ch == '['){
                ch = getch(); 
                switch(ch){
                    case 'A':
                        chageType(dynamic_x, dynamic_y, color); 
                        break;
                    case 'B': 
                        move_down(dynamic_type, dynamic_changeType, color);
                        break;
                    case 'C': 
                        move_right(dynamic_type, dynamic_changeType, color);
                        break;
                    case 'D': 
                        move_left(dynamic_type, dynamic_changeType, color);
                        break;
                    default:
                        break;
                }
            }   
        }
       }
       game_over();
}

void sig_handler(int signum)//信号处理动作
{
    move_down(dynamic_type, dynamic_changeType, color);
    //判断游戏是否结束了   有列顶满就结束-->有行是空的，再取反
    if (check_game_over()==1)
    {
        recover_attr();
        //输出游戏结束了
        game_over();
        //进程退出
        exit(0);
    }
}
void alarm_us(int n)
{
     struct itimerval value = {{0,n},{2,0}};
     setitimer(ITIMER_REAL,&value,NULL);
}

void game_over(){//打印游戏结束信息
        printf("\33[32;9H********** Game Over ********\33[0m");
        printf("\33[?25h");
        printf("\n\n");
    }

int check_game_over(){//检查空行
    for (int i = 0; i < 24; i++)
    {
            if(check_line_blank(i)){
                return 0;
            }
    }
    return 1;
}


int check_line_blank(int line){//判断空行
    for (int i = 0; i < 28; i++)
    {
        //所有的都判断完了，为null才为null
        if(matrix[line][i]!=0){
            return 0;
        }
    }
    return 1;
}
void init_game_ui()//初始化游戏界面
{
    //打印初始界面
    print_start_ui();
    getchar();

    srandom(time(NULL));
    type = random() %7;
    change_type = random() %4;

    dynamic_x = init_x;
    dynamic_y = init_y;
    dynamic_type = type;
    dynamic_changeType = change_type;

    print_mode_shape(type,change_type,init_x,init_y,color_init);

    print_next_shape(color);

    //隐藏光标
    printf("\33[?25l");    
}

int main(){
    //memset(matrix, 0, sizeof(matrix));
    init_game_ui();

    signal(SIGALRM,sig_handler);//绑定信号
    alarm_us(interval);//

    key_control();//键盘控制
    return 0;
}
